package org.ReportDesigner.designerXML;

import org.ReportDesigner.controlModel.Type;
import org.ReportDesigner.reportModel.ReportElement;
import org.apache.log4j.Logger;
import org.reflections.Reflections;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;


/**
 * @see -
 */
public class TypesMap {
    private static final Logger log = Logger.getLogger(TypesMap.class);
    static HashMap<String, Class> elementMap;

   //заполнение каоты класса при инициализации
    static {
        elementMap =  new HashMap<String, Class>();
        Reflections reflect = new Reflections("org.ReportDesigner.reportModel");
        Set<Class<? extends ReportElement>> classSet = reflect.getSubTypesOf(ReportElement.class);
        Iterator<Class<? extends ReportElement>> itClassSet =  classSet.iterator();
        while (itClassSet.hasNext()){
            Class<? extends ReportElement> reportElement = itClassSet.next();
            String key = reportElement.getAnnotation(Type.class).name();
            Class purpose = reportElement;
            elementMap.put(key, purpose);
        }
    }

    public TypesMap() {

    }

    //проверка на вхождение ключа в карту
    public boolean inMap(String key){
        return elementMap.containsKey(key);
    }

    //создание нового класса
    public ReportElement getNewElementByKey(String key) {
        ReportElement reportElement = null;
        String name;
        try {
            //создание нового экземпляра класса по имени тега
            reportElement = (ReportElement) elementMap.get(key).newInstance();

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return reportElement;
    }

    public String getClassName(String key){
        return elementMap.get(key).getName();
    }



}
